/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.cobranza.mbean;

import com.brain.cobranza.dto.CargaDetaDto;
import com.brain.cobranza.dto.CargaDto;
import com.brain.cobranza.dto.EmpresaCobranzaDto;
import com.brain.cobranza.manager.AsigCarteraManager;
import com.brain.cobranza.manager.CargaDetaManager;
import com.brain.cobranza.manager.CargaManager;
import com.brain.cobranza.manager.EmpresaCobranzaManager;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ArchivoDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.ArchivoManager;
import com.brain.core.view.mbean.*;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.RecursosManager;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("cargaMBean")
@Scope("session")
public class CargaMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(CargaMBean.class);
    @Resource
    private CargaManager manager;
    @Resource
    private CargaDetaManager detaManager;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ArchivoManager archivoManager;
    @Resource
    private AsigCarteraManager asigCarteraManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<CargaDto> lista;
    private CargaDto dto;
    private CargaDto dtoFiltro;
    private String keyEntidad = "key.entidad.carga";
    private SelectItem[] siEstado;
    private SelectItem[] siTipoArchivo;
    private List<EmpresaCobranzaDto> listaEmpresa;
    private List<CargaDto> listaCargaDto;
    private CargaDetaDto detaDto;
    private UploadedFile upFile;
    public Boolean mostrarReferencia = true;

    public CargaMBean() {
        this.dtoFiltro = new CargaDto();
    }

    public String iniciar() {
        this.lista = null;
        this.dto = new CargaDto();
        return manager.getUrlLista();
    }

    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializar();
        return manager.getUrl();
    }

    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }

        return manager.getUrl();
    }

    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            logger.error(ex);
        }
        return manager.getUrl();
    }

    public void verDetalle() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        if (this.detaDto.getId() != null) {
            try {
                this.detaDto = this.detaManager.obtenerPorId(this.detaDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }

    public void buscar() {
        try {
            this.lista = this.manager.obtener(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    private Boolean validarFormulario() {
        Boolean condicion = true;
        if (dto.getEmpresaCobranzaDto() == null) {
            showError(UtilCore.Internacionalizacion.getMensajeInternacional("carga.empresa.validacion"));
            condicion = false;
        }
        if (dto.getArchivo().equals("P")){
        if (dto.getArchivoClienteDto() == null) {
            showError(UtilCore.Internacionalizacion.getMensajeInternacional("carga.archivo.cliente.validacion"));
            condicion = false;
        }
        }
        if (upFile == null) {
            showError(UtilCore.Internacionalizacion.getMensajeInternacional("carga.archivo.validacion"));
            condicion = false;
        }
        return condicion;
    }

    public void save() throws DAOException {
        try {
            if (validarFormulario()) {
                if (sessionMBean.getAccion() == applicationMBean.getNuevo() && upFile != null) {
                    listenerFile(null);
                }
                manager.guardar(this.dto);
                if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                    this.manager.guardarArchivo(this.dto);
                    if (llenarDetalle() == true) {
                        this.manager.guardarArchivo(this.dto);
                    } else {
                        showError("OCURRIO UN ERROR AL LLENAR EL DETALLE DEL DOCUMENTO , POR FAVOR REVISELO");
                    }
                }
                editar();
            }
        } catch (Exception ex) {
           logger.error(ex.getMessage());
        }
    }

    public Boolean llenarDetalle() {
        Boolean methodState = true;
        try {
            int cont = 0;
            int cantRegistros = 0;
            int i = 1;
            POIFSFileSystem fsFileSystem = new POIFSFileSystem(upFile.getInputstream());
            Workbook workBook = WorkbookFactory.create(fsFileSystem);
            Sheet hssfSheet = workBook.getSheetAt(0);
            Iterator rowIterator = hssfSheet.rowIterator();
            while (rowIterator.hasNext()) {
                if (this.dto.getArchivo().equals("C")) {
                    if (i > dto.getEmpresaCobranzaDto().getFilaArchivoCliente() - hssfSheet.getFirstRowNum() - 1) {
                        this.detaManager.procesar(this.dto, rowIterator);
                        cantRegistros++;
                    } else {
                        if (rowIterator.hasNext()) {
                            rowIterator.next();
                        }
                    }
                } else if (this.dto.getArchivo().equals("P")) {
                    if (i > dto.getEmpresaCobranzaDto().getFilaArchivoPago() - hssfSheet.getFirstRowNum() - 1) {
                        this.detaManager.procesar(this.dto, rowIterator);
                        cantRegistros++;
                    } else {
                        if (rowIterator.hasNext()) {
                            rowIterator.next();
                        }
                    }
                }
                cont++;
                i++;
            }
            this.dto.setCantidadRegistros(Long.valueOf(cantRegistros));
            this.manager.guardarCantRegistros(dto);
            methodState = true;
        } catch (Exception e) {
            methodState = false;
            logger.error(e.getMessage());
        }
        return methodState;
    }

    public String cerrar() {
        this.dto.setEstado("C");
        this.manager.guardarEstado(this.dto);
        return editar();
    }
    
    public String anular() {
        this.dto.setEstado("I");
        this.manager.guardarEstado(this.dto);
        return editar();
    }
    
    public String reactivar() {
        this.dto.setEstado("A");
        this.manager.guardarEstado(this.dto);
        return editar();
    }

    public String activar() {
        if (dto.getArchivo().equals("C")) {
            this.manager.activarCargaCliente(this.dto);
        } else if (dto.getArchivo().equals("P")) {
            this.manager.activarCargaPago(this.dto);
        }
        //this.dto.setEstado("A");
        //this.manager.guardarEstado(this.dto);
        return editar();
    }

    public String visualizarValores() {
        if (dto.getArchivo().equals("C")) {
            mostrarReferencia = Boolean.TRUE;
        } else if (dto.getArchivo().equals("P")) {
            mostrarReferencia = Boolean.FALSE;
        }
        return null;
    }

    public void validar() {
        //this.dto.setEstado("V");        
        //this.manager.guardarEstado(this.dto);
        if (dto.getArchivo().equals("C")) {
            this.manager.validarCargaCliente(this.dto);
        } else if (dto.getArchivo().equals("P")) {
            this.manager.validarCargaPago(this.dto);
        }
        editar();
    }

    public String verBitacora() {

        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    public String retroceder() {
        buscar();
        return manager.getUrlLista();
    }

    public void evento(FileUploadEvent event) {
        upFile = event.getFile();
    }

    public void listenerFile(FileUploadEvent event) throws DAOException {
        // UploadedFile file = event.getFile();
        ArchivoDto archivoDto = new ArchivoDto();
        archivoDto.setEsAtributo(Boolean.TRUE);
        archivoDto.setNombre(upFile.getFileName());
        archivoDto.setTipoDto(null);
        archivoDto.setPeso(BigDecimal.valueOf(upFile.getSize()));
        archivoDto.setComentario("ARCHIVO CARGA XLS");
        archivoDto.setBites(upFile.getContents());
        archivoDto.setDetalle(archivoDto.getNombre());
        archivoDto.setEstado(Boolean.TRUE);
        if (archivoDto.getNombre().indexOf(".") != -1) {
            archivoDto.setExtension(archivoDto.getNombre().substring(archivoDto.getNombre().lastIndexOf(".") + 1, archivoDto.getNombre().length()));
        }
        this.dto.setNombreArchivo(upFile.getFileName());
        this.dto.setArchivoDto(archivoDto);
        //   this.upFile = file;
    }

    /**
     * GETTER AND SETTER*
     */
    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        CargaMBean.logger = logger;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<CargaDto> getLista() {
        return lista;
    }

    public void setLista(List<CargaDto> lista) {
        this.lista = lista;
    }

    public CargaDto getDto() {
        return dto;
    }

    public void setDto(CargaDto dto) {
        this.dto = dto;
    }

    public CargaDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(CargaDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public SelectItem[] getSiEstado() {
        this.siEstado = this.manager.siEstado();
        return this.siEstado;
    }

    public void setSiEstado(SelectItem[] siEstado) {
        this.siEstado = siEstado;
    }

    public CargaManager getManager() {
        return manager;
    }

    public void setManager(CargaManager manager) {
        this.manager = manager;
    }

    public List<EmpresaCobranzaDto> getListaEmpresa() throws DAOException {
        EmpresaCobranzaManager empresaCobranzaManager = (EmpresaCobranzaManager) WebServletContextListener.getApplicationContext().getBean("empresaCobranzaManager");
        this.listaEmpresa = empresaCobranzaManager.obtenerTodos();
        return this.listaEmpresa;
    }

    public void setListaEmpresa(List<EmpresaCobranzaDto> listaEmpresa) {
        this.listaEmpresa = listaEmpresa;
    }

    public SelectItem[] getSiTipoArchivo() {
        siTipoArchivo = this.manager.siTipoArchivo();
        return siTipoArchivo;
    }

    public void setSiTipoArchivo(SelectItem[] siTipoArchivo) {
        this.siTipoArchivo = siTipoArchivo;
    }

    public CargaDetaDto getDetaDto() {
        return detaDto;
    }

    public void setDetaDto(CargaDetaDto detaDto) {
        this.detaDto = detaDto;
    }

    public CargaDetaManager getDetaManager() {
        return detaManager;
    }

    public void setDetaManager(CargaDetaManager detaManager) {
        this.detaManager = detaManager;
    }
 

    public AsigCarteraManager getAsigCarteraManager() {
        return asigCarteraManager;
    }

    public void setAsigCarteraManager(AsigCarteraManager asigCarteraManager) {
        this.asigCarteraManager = asigCarteraManager;
    }
    
     public List<CargaDto> listarArchivoCliente() throws DAOException {
        return manager.listarClientesFiles(dto);
    }

       public List<CargaDto> getListaCargaDto() throws DAOException {
        listaCargaDto = listarArchivoCliente();
        return listaCargaDto;
    }

    public void setListaCargaDto(List<CargaDto> listaCargaDto) {
        this.listaCargaDto = listaCargaDto;
    }
 
 

    public Boolean isMostrarReferencia() {
        return mostrarReferencia;
    }

    public void setMostrarReferencia(Boolean mostrarReferencia) {
        this.mostrarReferencia = mostrarReferencia;
    }

    public UploadedFile getUpFile() {
        return upFile;
    }

    public void setUpFile(UploadedFile upFile) {
        this.upFile = upFile;
    }

    public ArchivoManager getArchivoManager() {
        return archivoManager;
    }

    public void setArchivoManager(ArchivoManager archivoManager) {
        this.archivoManager = archivoManager;
    }
}
